# 上面两句也可以写成一句
# 得到的是一个链式调用语句
# 是在函数 的调用  过程中的一个形式
"""
def isOdd(num):
    if num % 2 == 0:
        return False
    return True


def add(x, y):
    return x + y


result = isOdd(10)
print(result)

print(isOdd(add(3, 7)))
"""

# 函数的嵌套调用，是在函数的定义中写了一句调用其他的函数
"""
def a():
    print('函数a')


def b():
    print('函数b')
    a()


b()
"""


# 在一个函数定义的内部，将调用其他函数的语句调换，
# 能够调整打印顺序

"""
def a():
    num1 = 10
    print('函数a')


def b():
    num2 = 20
    a()
    print('函数b')


def c():
    num3 = 30
    b()
    print('函数c')


def d():
    num4 = 40
    c()
    print('函数d')


d()
"""

# 调试器的左下角，能够看到函数之间的  调用栈
# 调用栈里面描述了当前这个代码的函数之间调用关系
# 每一层调用关系就称为  函数的栈帧
# 每个函数的局部变量就在这个函数栈帧中体现
# 每一层栈帧，在选中了之后，都能看到里面的局部变量，
# 即每个局部变量保存在对应的栈帧中

# 调用函数，则产生对应的栈帧
# 函数调用结束，则对应的栈帧消亡(其中保存的局部变量也销毁了)

# 下面的代码中，虽然每个函数中都定义了一个名叫num的变量
# 但他们之间是不同的，可以从两种角度看待它们之间的区别
# 角度1：不同函数内的局部变量的作用域只在其对应的函数内部，
# 角度2：不同函数内的变量都对应不同的内存空间，比如：
# a函数内部的num对应的内存空间是
# a函数所对应的函数栈帧对应的内存空间的一部分


def a():
    num = 10
    print('函数a')


def b():
    num = 20
    a()
    print('函数b')


def c():
    num = 30
    b()
    print('函数c')


def d():
    num = 40
    c()
    print('函数d')


d()
